/**
 * 房间状态管理器
 * 
 * 功能说明：
 * 1. 定义所有房间状态的配置信息（颜色、图标、描述等）
 * 2. 管理状态之间的转换规则和业务逻辑
 * 3. 提供状态验证和权限控制功能
 * 4. 支持按分类查询和状态优先级管理
 * 
 * 设计模式：静态工具类 + 配置驱动
 */

import { RoomStatus } from '../../../types/room';

// ========== 状态分类枚举 ==========

/**
 * 房间状态分类
 * 用于将不同的房间状态按业务逻辑分组管理
 */
export const StatusCategory = {
  BOOKING: 'booking',       // 预订类：可用、已预订、已入住、已退房等
  CLEANING: 'cleaning',     // 清洁类：待清洁、清洁中、已清洁等
  MAINTENANCE: 'maintenance', // 维护类：维护中、维修、设备更换等
  SPECIAL: 'special',       // 特殊类：锁定、停用、临时不可用等
} as const;

/**
 * 状态分类类型
 * 提供类型安全的分类值
 */
export type StatusCategory =
  (typeof StatusCategory)[keyof typeof StatusCategory];

// ========== 状态优先级定义 ==========

/**
 * 状态优先级映射表
 * 数字越大优先级越高，用于解决状态冲突和业务规则判断
 * 
 * 优先级分组：
 * - 0-9: 基础状态（可用等）
 * - 10-29: 预订相关状态
 * - 30-49: 清洁相关状态  
 * - 50-69: 维护相关状态
 * - 70+: 特殊状态
 */
const STATUS_PRIORITY: Record<RoomStatus, number> = {
  // 基础状态 (0-9)
  [RoomStatus.AVAILABLE]: 0,

  // 预订相关状态 (10-29)
  [RoomStatus.BOOKED]: 15,
  [RoomStatus.PARTIALLY_BOOKED]: 12,
  [RoomStatus.OCCUPIED]: 20,
  [RoomStatus.CHECKED_OUT]: 8,
  [RoomStatus.VIP_BOOKED]: 25,

  // 清洁状态 (30-49)
  [RoomStatus.DIRTY]: 35,
  [RoomStatus.CLEANING]: 40,
  [RoomStatus.CLEANED]: 30,
  [RoomStatus.DEEP_CLEANING]: 45,
  [RoomStatus.INSPECTING]: 38,

  // 维护状态 (50-69)
  [RoomStatus.MAINTENANCE]: 55,
  [RoomStatus.ROUTINE_MAINTENANCE]: 50,
  [RoomStatus.DEEP_MAINTENANCE]: 60,
  [RoomStatus.REPAIR]: 65,
  [RoomStatus.EQUIPMENT_REPLACEMENT]: 68,

  // 特殊状态 (70+)
  [RoomStatus.LOCKED]: 75,
  [RoomStatus.TEMPORARILY_UNAVAILABLE]: 70,
  [RoomStatus.OUT_OF_ORDER]: 80,
};

// ========== 状态配置接口 ==========

/**
 * 房间状态显示配置接口
 * 定义每个状态在UI中的显示方式和交互权限
 */
export interface StatusConfig {
  label: string;              // 完整标签（如"已预订"）
  shortLabel: string;         // 简短标签（如"预订"）
  icon: string;               // 图标（如"📅"）
  color: string;              // 文字颜色（如"#0a58ca"）
  backgroundColor: string;    // 背景颜色（如"#cfe2ff"）
  borderColor: string;        // 边框颜色（如"#0d6efd"）
  category: StatusCategory;   // 状态分类
  description: string;        // 状态描述
  allowDrag: boolean;         // 是否允许拖拽
  allowDrop: boolean;         // 是否允许作为拖拽目标
}

// ========== 状态配置映射表 ==========

/**
 * 所有房间状态的详细配置
 * 包含每个状态的显示样式、交互权限和业务规则
 */
export const STATUS_CONFIGS: Record<RoomStatus, StatusConfig> = {
  // ========== 基础状态 ==========
  [RoomStatus.AVAILABLE]: {
    label: '可用',
    shortLabel: '可用',
    icon: '✅',
    color: '#6c757d',
    backgroundColor: '#f8f9fa',
    borderColor: '#dee2e6',
    category: StatusCategory.BOOKING,
    description: '房间可供预订',
    allowDrag: false,    // 可用状态不能拖拽
    allowDrop: true,     // 可以作为拖拽目标
  },

  // ========== 预订相关状态 ==========
  [RoomStatus.BOOKED]: {
    label: '已预订',
    shortLabel: '预订',
    icon: '📅',
    color: '#0a58ca',
    backgroundColor: '#cfe2ff',
    borderColor: '#0d6efd',
    category: StatusCategory.BOOKING,
    description: '房间已被预订',
    allowDrag: true,     // 已预订状态可以拖拽移动
    allowDrop: false,    // 不能作为拖拽目标
  },

  [RoomStatus.PARTIALLY_BOOKED]: {
    label: '部分预订',
    shortLabel: '部分',
    icon: '📊',
    color: '#0a58ca',
    backgroundColor: '#e7f3ff',
    borderColor: '#6ea8fe',
    category: StatusCategory.BOOKING,
    description: '房间部分时间段被预订',
    allowDrag: true,
    allowDrop: true,
  },

  [RoomStatus.OCCUPIED]: {
    label: '已入住',
    shortLabel: '入住',
    icon: '🏠',
    color: '#198754',
    backgroundColor: '#d1ecf1',
    borderColor: '#20c997',
    category: StatusCategory.BOOKING,
    description: '客人已入住',
    allowDrag: true,
    allowDrop: false,
  },

  [RoomStatus.CHECKED_OUT]: {
    label: '已退房',
    shortLabel: '退房',
    icon: '🚪',
    color: '#6c757d',
    backgroundColor: '#e9ecef',
    borderColor: '#adb5bd',
    category: StatusCategory.BOOKING,
    description: '客人已退房，待清洁',
    allowDrag: false,
    allowDrop: false,
  },

  [RoomStatus.VIP_BOOKED]: {
    label: 'VIP预订',
    shortLabel: 'VIP',
    icon: '⭐',
    color: '#0a58ca',
    backgroundColor: '#b6d7ff',
    borderColor: '#0d6efd',
    category: StatusCategory.BOOKING,
    description: 'VIP客户预订',
    allowDrag: true,
    allowDrop: false,
  },

  // 清洁状态
  [RoomStatus.DIRTY]: {
    label: '待清洁',
    shortLabel: '脏房',
    icon: '🧹',
    color: '#e55100',
    backgroundColor: '#fff3e0',
    borderColor: '#fd7e14',
    category: StatusCategory.CLEANING,
    description: '房间需要清洁',
    allowDrag: false,
    allowDrop: false,
  },

  [RoomStatus.CLEANING]: {
    label: '清洁中',
    shortLabel: '清洁',
    icon: '🧽',
    color: '#e55100',
    backgroundColor: '#ffe0b3',
    borderColor: '#fd7e14',
    category: StatusCategory.CLEANING,
    description: '正在清洁房间',
    allowDrag: false,
    allowDrop: false,
  },

  [RoomStatus.CLEANED]: {
    label: '已清洁',
    shortLabel: '洁净',
    icon: '✨',
    color: '#198754',
    backgroundColor: '#d4edda',
    borderColor: '#20c997',
    category: StatusCategory.CLEANING,
    description: '房间已清洁完毕',
    allowDrag: false,
    allowDrop: true,
  },

  [RoomStatus.DEEP_CLEANING]: {
    label: '深度清洁',
    shortLabel: '深洁',
    icon: '🧼',
    color: '#e55100',
    backgroundColor: '#ffccb3',
    borderColor: '#fd7e14',
    category: StatusCategory.CLEANING,
    description: '正在进行深度清洁',
    allowDrag: false,
    allowDrop: false,
  },

  [RoomStatus.INSPECTING]: {
    label: '检查中',
    shortLabel: '检查',
    icon: '🔍',
    color: '#ffffff',
    backgroundColor: '#795548',
    borderColor: '#5d4037',
    category: StatusCategory.CLEANING,
    description: '正在检查房间质量',
    allowDrag: false,
    allowDrop: false,
  },

  // 维护状态
  [RoomStatus.MAINTENANCE]: {
    label: '维护中',
    shortLabel: '维护',
    icon: '🔧',
    color: '#495057',
    backgroundColor: '#f8f9fa',
    borderColor: '#6c757d',
    category: StatusCategory.MAINTENANCE,
    description: '房间正在维护',
    allowDrag: false,
    allowDrop: false,
  },

  [RoomStatus.ROUTINE_MAINTENANCE]: {
    label: '日常维护',
    shortLabel: '日维',
    icon: '🛠️',
    color: '#6c757d',
    backgroundColor: '#e9ecef',
    borderColor: '#adb5bd',
    category: StatusCategory.MAINTENANCE,
    description: '进行日常维护',
    allowDrag: false,
    allowDrop: false,
  },

  [RoomStatus.DEEP_MAINTENANCE]: {
    label: '深度维护',
    shortLabel: '深维',
    icon: '⚙️',
    color: '#495057',
    backgroundColor: '#dee2e6',
    borderColor: '#6c757d',
    category: StatusCategory.MAINTENANCE,
    description: '进行深度维护',
    allowDrag: false,
    allowDrop: false,
  },

  [RoomStatus.REPAIR]: {
    label: '故障维修',
    shortLabel: '维修',
    icon: '🔨',
    color: '#ffffff',
    backgroundColor: '#d32f2f',
    borderColor: '#b71c1c',
    category: StatusCategory.MAINTENANCE,
    description: '正在维修故障',
    allowDrag: false,
    allowDrop: false,
  },

  [RoomStatus.EQUIPMENT_REPLACEMENT]: {
    label: '设备更换',
    shortLabel: '换设',
    icon: '🔄',
    color: '#ffffff',
    backgroundColor: '#1976d2',
    borderColor: '#0d47a1',
    category: StatusCategory.MAINTENANCE,
    description: '正在更换设备',
    allowDrag: false,
    allowDrop: false,
  },

  // 特殊状态
  [RoomStatus.LOCKED]: {
    label: '房间锁定',
    shortLabel: '锁定',
    icon: '🔒',
    color: '#ffffff',
    backgroundColor: '#37474f',
    borderColor: '#263238',
    category: StatusCategory.SPECIAL,
    description: '房间被锁定，不可使用',
    allowDrag: false,
    allowDrop: false,
  },

  [RoomStatus.TEMPORARILY_UNAVAILABLE]: {
    label: '临时不可用',
    shortLabel: '暂停',
    icon: '⏸️',
    color: '#ffffff',
    backgroundColor: '#ff6f00',
    borderColor: '#e65100',
    category: StatusCategory.SPECIAL,
    description: '房间临时不可用',
    allowDrag: false,
    allowDrop: false,
  },

  [RoomStatus.OUT_OF_ORDER]: {
    label: '停用',
    shortLabel: '停用',
    icon: '🚫',
    color: '#ffffff',
    backgroundColor: '#000000',
    borderColor: '#000000',
    category: StatusCategory.SPECIAL,
    description: '房间停用',
    allowDrag: false,
    allowDrop: false,
  },
};

// ========== 状态流转规则 ==========

/**
 * 房间状态转换规则映射表
 * 定义每个状态可以转换到哪些其他状态
 * 用于业务逻辑验证和状态转换控制
 */
export const STATUS_TRANSITIONS: Record<RoomStatus, RoomStatus[]> = {
  // ========== 预订流程状态转换 ==========
  
  // 可用状态可以转为
  [RoomStatus.AVAILABLE]: [
    RoomStatus.BOOKED,              // 预订
    RoomStatus.PARTIALLY_BOOKED,    // 部分预订
    RoomStatus.VIP_BOOKED,          // VIP预订
    RoomStatus.MAINTENANCE,         // 维护
    RoomStatus.CLEANING,            // 清洁
    RoomStatus.LOCKED,              // 锁定
  ],

  // 已预订可以转为
  [RoomStatus.BOOKED]: [
    RoomStatus.OCCUPIED,            // 入住
    RoomStatus.AVAILABLE,           // 取消预订
    RoomStatus.PARTIALLY_BOOKED,    // 部分预订
    RoomStatus.VIP_BOOKED,          // 升级为VIP
  ],

  // 部分预订可以转为
  [RoomStatus.PARTIALLY_BOOKED]: [
    RoomStatus.BOOKED,              // 完全预订
    RoomStatus.AVAILABLE,           // 取消预订
    RoomStatus.OCCUPIED,            // 入住
  ],

  // 已入住可以转为
  [RoomStatus.OCCUPIED]: [
    RoomStatus.CHECKED_OUT,         // 退房
  ],

  // 已退房可以转为
  [RoomStatus.CHECKED_OUT]: [
    RoomStatus.DIRTY,               // 待清洁
    RoomStatus.CLEANING,            // 直接开始清洁
  ],

  // VIP预订可以转为
  [RoomStatus.VIP_BOOKED]: [
    RoomStatus.OCCUPIED,            // 入住
    RoomStatus.AVAILABLE,           // 取消预订
  ],

  // ========== 清洁流程状态转换 ==========

  // 待清洁可以转为
  [RoomStatus.DIRTY]: [
    RoomStatus.CLEANING,            // 开始清洁
    RoomStatus.DEEP_CLEANING,       // 深度清洁
  ],

  // 清洁中可以转为
  [RoomStatus.CLEANING]: [
    RoomStatus.CLEANED,             // 清洁完成
    RoomStatus.INSPECTING,          // 检查
  ],

  // 已清洁可以转为
  [RoomStatus.CLEANED]: [
    RoomStatus.AVAILABLE,           // 恢复可用
    RoomStatus.INSPECTING,          // 检查
  ],

  // 深度清洁可以转为
  [RoomStatus.DEEP_CLEANING]: [
    RoomStatus.CLEANED,             // 清洁完成
    RoomStatus.INSPECTING,          // 检查
  ],

  // 检查中可以转为
  [RoomStatus.INSPECTING]: [
    RoomStatus.AVAILABLE,           // 通过检查，恢复可用
    RoomStatus.CLEANING,            // 需要重新清洁
    RoomStatus.MAINTENANCE,         // 需要维护
  ],

  // ========== 维护流程状态转换 ==========

  // 维护类状态可以转为可用
  [RoomStatus.MAINTENANCE]: [RoomStatus.AVAILABLE],
  [RoomStatus.ROUTINE_MAINTENANCE]: [RoomStatus.AVAILABLE],
  [RoomStatus.DEEP_MAINTENANCE]: [RoomStatus.AVAILABLE],
  [RoomStatus.REPAIR]: [RoomStatus.AVAILABLE],
  [RoomStatus.EQUIPMENT_REPLACEMENT]: [RoomStatus.AVAILABLE],

  // ========== 特殊状态转换 ==========

  // 特殊状态
  [RoomStatus.LOCKED]: [RoomStatus.AVAILABLE],                    // 解锁
  [RoomStatus.TEMPORARILY_UNAVAILABLE]: [RoomStatus.AVAILABLE],   // 恢复可用
  [RoomStatus.OUT_OF_ORDER]: [RoomStatus.MAINTENANCE],            // 开始维护
};

// ========== 房间状态管理器类 ==========

/**
 * 房间状态管理器
 * 提供所有与房间状态相关的静态工具方法
 * 包括状态配置查询、权限验证、转换规则等
 */
export class RoomStatusManager {
  
  // ========== 状态配置查询方法 ==========

  /**
   * 获取状态配置
   * 返回指定状态的完整配置信息
   * @param status 房间状态
   * @returns 状态配置对象
   */
  static getStatusConfig(status: RoomStatus): StatusConfig {
    return STATUS_CONFIGS[status];
  }

  /**
   * 获取状态优先级
   * 用于解决状态冲突和业务规则判断
   * @param status 房间状态
   * @returns 优先级数值（数字越大优先级越高）
   */
  static getStatusPriority(status: RoomStatus): number {
    return STATUS_PRIORITY[status];
  }

  /**
   * 获取状态分类
   * @param status 房间状态
   * @returns 状态分类
   */
  static getStatusCategory(status: RoomStatus): StatusCategory {
    return STATUS_CONFIGS[status].category;
  }

  // ========== 交互权限验证方法 ==========

  /**
   * 检查状态是否可以拖拽
   * 用于拖拽操作的权限控制
   * @param status 房间状态
   * @returns 是否允许拖拽
   */
  static canDrag(status: RoomStatus): boolean {
    return STATUS_CONFIGS[status].allowDrag;
  }

  /**
   * 检查状态是否可以作为拖拽目标
   * 用于拖拽目标的权限控制
   * @param status 房间状态
   * @returns 是否允许作为拖拽目标
   */
  static canDrop(status: RoomStatus): boolean {
    return STATUS_CONFIGS[status].allowDrop;
  }

  // ========== 状态转换规则方法 ==========

  /**
   * 检查状态转换是否有效
   * 验证从一个状态转换到另一个状态是否符合业务规则
   * @param fromStatus 源状态
   * @param toStatus 目标状态
   * @returns 是否允许转换
   */
  static canTransition(fromStatus: RoomStatus, toStatus: RoomStatus): boolean {
    const allowedTransitions = STATUS_TRANSITIONS[fromStatus] || [];
    return allowedTransitions.includes(toStatus);
  }

  /**
   * 获取可转换的状态列表
   * 返回指定状态可以转换到的所有状态
   * @param fromStatus 源状态
   * @returns 可转换的状态列表
   */
  static getAvailableTransitions(fromStatus: RoomStatus): RoomStatus[] {
    return STATUS_TRANSITIONS[fromStatus] || [];
  }

  // ========== 状态查询和过滤方法 ==========

  /**
   * 按分类获取状态列表
   * 根据状态分类筛选出所有属于该分类的状态
   * @param category 状态分类
   * @returns 该分类下的所有状态
   */
  static getStatusesByCategory(category: StatusCategory): RoomStatus[] {
    return Object.keys(STATUS_CONFIGS).filter(
      status => STATUS_CONFIGS[status as RoomStatus].category === category
    ) as RoomStatus[];
  }

  /**
   * 获取最高优先级状态
   * 用于解决多个状态冲突的情况
   * @param statuses 状态列表
   * @returns 优先级最高的状态
   */
  static getHighestPriorityStatus(statuses: RoomStatus[]): RoomStatus {
    return statuses.reduce((highest, current) =>
      STATUS_PRIORITY[current] > STATUS_PRIORITY[highest] ? current : highest
    );
  }

  // ========== 状态显示和格式化方法 ==========

  /**
   * 格式化状态显示文本
   * 生成带图标的状态显示文本
   * @param status 房间状态
   * @param isShort 是否使用简短标签
   * @returns 格式化后的显示文本
   */
  static formatStatusText(
    status: RoomStatus,
    isShort: boolean = false
  ): string {
    const config = STATUS_CONFIGS[status];
    return `${config.icon} ${isShort ? config.shortLabel : config.label}`;
  }

  /**
   * 获取状态描述
   * @param status 房间状态
   * @returns 状态描述文本
   */
  static getStatusDescription(status: RoomStatus): string {
    return STATUS_CONFIGS[status].description;
  }

  // ========== 状态验证方法 ==========

  /**
   * 验证状态值是否有效
   * 检查字符串是否为有效的房间状态枚举值
   * @param status 待验证的状态字符串
   * @returns 是否为有效的房间状态
   */
  static isValidStatus(status: string): status is RoomStatus {
    return Object.values(RoomStatus).includes(status as RoomStatus);
  }
}
